/*
 * Copyright [2022] [https://www.xiaonuo.vip]
 *
 * Snowy采用APACHE LICENSE 2.0开源协议，您在使用过程中，需要注意以下几点：
 *
 * 1.请不要删除和修改根目录下的LICENSE文件。
 * 2.请不要删除和修改Snowy源码头部的版权声明。
 * 3.本项目代码可免费商业使用，商业使用请保留源码和相关描述文件的项目出处，作者声明等。
 * 4.分发源码时候，请注明软件出处 https://www.xiaonuo.vip
 * 5.不可二次分发开源参与同类竞品，如有想法可联系团队xiaonuobase@qq.com商议合作。
 * 6.若您的项目无法满足以上几点，需要更多功能代码，获取Snowy商业授权许可，请在官网购买授权，地址为 https://www.xiaonuo.vip
 */
package com.lg.common.pojo;

import com.lg.common.enums.CommonExceptionEnum;
import io.swagger.annotations.ApiModelProperty;
import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.service.ResponseMessage;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 接口返回值 封装
 *
 * @author liuga
 * @since 2023-02-01
 **/
public class ApiResult<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    public static final int CODE_SUCCESS = 200;
    public static final int CODE_ERROR = 500;

    @ApiModelProperty(value = "状态码")
    private int code;

    @ApiModelProperty(value = "提示语")
    private String msg;

    @ApiModelProperty(value = "返回数据")
    private T data;

    public ApiResult() {
    }

    public ApiResult(int code, String msg, T data) {
        this.setCode(code);
        this.setMsg(msg);
        this.setData(data);
    }

    /**
     * 获取code
     *
     * @return code
     */
    public Integer getCode() {
        return this.code;
    }

    /**
     * 获取msg
     *
     * @return msg
     */
    public String getMsg() {
        return this.msg;
    }

    /**
     * 获取data
     *
     * @return data
     */
    public T getData() {
        return this.data;
    }

    /**
     * 给code赋值，连缀风格
     *
     * @param code code
     * @return 对象自身
     */
    public ApiResult<T> setCode(int code) {
        this.code = code;
        return this;
    }

    /**
     * 给msg赋值，连缀风格
     *
     * @param msg msg
     * @return 对象自身
     */
    public ApiResult<T> setMsg(String msg) {
        this.msg = msg;
        return this;
    }

    /**
     * 给data赋值，连缀风格
     *
     * @param data data
     * @return 对象自身
     */
    public ApiResult<T> setData(T data) {
        this.data = data;
        return this;
    }


    // ============================  构建  ==================================

    // 构建成功
    public static <T> ApiResult<T> ok() {
        return new ApiResult<>(CODE_SUCCESS, "操作成功", null);
    }

    public static <T> ApiResult<T> ok(String msg) {
        return new ApiResult<>(CODE_SUCCESS, msg, null);
    }

    public static <T> ApiResult<T> code(int code) {
        return new ApiResult<>(code, null, null);
    }

    public static <T> ApiResult<T> data(T data) {
        return new ApiResult<>(CODE_SUCCESS, "操作成功", data);
    }

    // 构建失败
    public static <T> ApiResult<T> error() {
        return new ApiResult<>(CODE_ERROR, "服务器异常", null);
    }

    public static <T> ApiResult<T> error(String msg) {
        return new ApiResult<>(CODE_ERROR, msg, null);
    }
    public static <T> ApiResult<T> error(Integer code,String msg) {
        return new ApiResult<>(code, msg, null);
    }

    // 构建指定状态码
    public static <T> ApiResult<T> code(int code, String msg, T data) {
        return new ApiResult<>(code, msg, data);
    }

    /*
     * toString()
     */
    @Override
    public String toString() {
        return "{"
                + "\"code\": " + this.getCode()
                + ", \"msg\": \"" + this.getMsg() + "\""
                + ", \"data\": \"" + this.getData() + "\""
                + "}";
    }

}
